package com.h.book.controller;

import com.h.book.constant.Constant;
import com.h.book.enums.BookStatusEnum;
import com.h.book.enums.ResultCodeEnum;
import com.h.book.modle.*;
import com.h.book.service.BookService;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.awt.print.Book;
import java.util.List;

@Slf4j
// 这个类是和前端进行交互的
@RequestMapping("/book")
@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    // 添加图书接口
    @RequestMapping(value = "/addBook",produces = "application/json")
    // 不能返回String类的数据，前端无法进行处理，所以这里需要转换成 JSON 或者使用 Result进行返回
    public String addBook(BookInfo bookInfo) {
        // 在开头和结尾添加一个日志，为了检查报错和防止攻击
        log.info("添加图书: request : {}",bookInfo);
        if(!StringUtils.hasLength(bookInfo.getBookName())
            || !StringUtils.hasLength(bookInfo.getAuthor())
            || bookInfo.getCount() == null
            || bookInfo.getPrice() == null
            || !StringUtils.hasLength(bookInfo.getPublish())
            || bookInfo.getStatus() == null) {
            log.warn("参数不合法 request : {}",bookInfo);
            return "参数不合法";
        }
        try {
            bookService.addBook(bookInfo);
            return "";
        }catch (Exception e) {
            log.error("添加图书异常 e : {}",e);
            return "参数错误";
        }
    }

    // 展示列表的接口
    @RequestMapping("/getListByPage")
    public Result<ResponseResult<BookInfo>> getListByPage(PageRequest pageRequest, HttpSession session) {
        log.info("图书列表 request : {}",pageRequest);
//        // 强制登录: (先进行一个简单得到了解，后面会使用 MyBatis-Plus进行简便的强制登录操作)
//        // 在没有登录的时候，就让其进行强制登录，使用 Session 进行得到 SessionId 进行查看是否登录
//        // session.getAttribute() 也可能会出现 null 的情况，我们需要进行判断
//        if(session.getAttribute(Constant.SESSION_USER_INFO) == null) {
//            // 用户未登录
//            return Result.unlogin();
//        }
//        // 对于session.getAttribute() 中的字符串呢是可能会进行更改的所以呢，我们定义一个静态变量，进行放入这个字符串，更改的话，只需要更改一个地方就可以了
//        UserInfo userInfo = (UserInfo) session.getAttribute(Constant.SESSION_USER_INFO);
//        if (userInfo == null || userInfo.getId() < 0) {
//            // 用户未登录
//            // 如果把错误信息放入到 这个列表操作的返回对象中，添加属性是可以进行的，但是还有一些接口返回的是String类型的，所以可以将其封装成一个类，
//            // 之后把所有接口返回的类型使用泛型进行接收
//            return Result.unlogin();
//        }
        ResponseResult<BookInfo> listByPage =  bookService.getListByPage(pageRequest);
        return Result.success(listByPage);
    }

    // 修改图书的接口
    // 1、我们在点击修改之后，要返回对应的所有信息
    @RequestMapping("/queryBookById")
    public BookInfo queryBookById(Integer bookId) {
        log.info("查询图书信息 bookId : {}",bookId);
        return bookService.queryBookById(bookId);
    }
    // 2、根据返回的信息，看看哪些数据需要进行修改，这里因为不确定修改哪个属性，所以我们需要使用 动态SQL
    @RequestMapping("/updateBook")
    public Result updateBook(BookInfo bookInfo) {
        log.info("修改图书数据 bookInfo : {}",bookInfo);
        try {
            bookService.updateBook(bookInfo);
            return Result.success("");
        }catch (Exception e) {
            log.info("修改图书出现异常 e : ",e);
            return Result.fail("修改图书出现异常");
        }
    }

    // 删除图书
    // 正常情况下不使用物理删除，我们使用逻辑删除，只是把状态修改，不让其查询到就可以做到修改
    // 所以本质上和 修改的接口是使用的一个
    @RequestMapping("/deleteBook")
    public Result deleteBook(Integer bookId) {
        log.info("删除图书数据 bookId : {}",bookId);
        try {
            BookInfo bookInfo = new BookInfo();
            bookInfo.setId(bookId);
            bookInfo.setStatus(BookStatusEnum.DELETED.getCode());
            bookService.updateBook(bookInfo);
            return Result.success("");
        }catch (Exception e) {
            log.info("删除图书出现异常 e : ",e);
            return Result.fail("删除图书出现异常");
        }
    }

    @RequestMapping("/batchDeleteBook")
    public Boolean batchDeleteBook(@RequestParam List<Integer> ids) {
        log.info("批量删除图书 ids: {}",ids);
        try {
            bookService.batchDeleteBook(ids);
            return true;
        }catch (Exception e) {
            log.error("批量删除异常 e: ",e);
            return false;
        }
    }
}
